package main

import (
	"fmt"
	"time"
)

// 生产者
func producer(ch chan int) {
	for i := 1; i <= 10; i++ {
		println("生产者生产数据", i)
		ch <- i
	}
	// 关闭channel，无法写入，但是还可以读取
	//写完记得要关闭，否则消费者会一直阻塞等待，for读取的时候会报错死锁
	close(ch)
}

// 消费者
func consumer(ch chan int, exitChan chan bool) {
	// 从channel中读取数据,阻塞等待，直到有数据写入channel，如果channel关闭，则退出循环
	for i := range ch {
		fmt.Println("消费者消费数据", i)
		// 休眠1秒
		time.Sleep(time.Second * 1)
	}
	// 发送完成信号
	exitChan <- true
	close(exitChan)
}

// 创建一个channel
func main() {

	// 创建一个channel
	ch := make(chan int)
	exitChan := make(chan bool)
	// 启动生产者
	go producer(ch)

	// 启动消费者
	go consumer(ch, exitChan)

	for {
		if _, ok := <-exitChan; !ok {
			fmt.Println("所有任务完成")
			break
		}
	}

}
